第 3 步 - 加载地区包

在本步骤中,使用 Kanzi Engine API 加载在您在本教程的上一步骤中在 Kanzi 应用程序中创建的地区包。

使用 Kanzi Engine API 加载地区包

在本节中,您将使用 Kanzi Engine API 加载您在上一节创建的地区包。应用程序在启动时加载地区包,并触发加载存储在 <KanziWorkspace>/Projects/<ProjectName>/Application/bin/Locale_packs 目录中的所有地区的地区包。

要加载地区包:

  1. 在 Windows 资源管理器的 <ProjectName>/Application/bin/Locale_packs 目录中,创建 binaries.cfg 文件并向其添加包含要加载的地区包的每个 kzb 文件的位置和名称。每行只添加一个 kzb 文件的名称。
    例如,如果您有JapaneseChineseKorean 地区的地区包,并将ja-JP 地区名称用于Japanese 地区、zh-ZH 用于Chinese 地区、ko-KR 用于Korean,创建binaries.cfg,在文本编辑器中打开,将这些地区包文件的名称添加到binaries.cfg文件并保存文件。
    ja-JP
    ko-KR
    zh-ZH
    
  2. 在 Visual Studio 中,为您的应用程序打开位于 Application/configs/platforms/win32 的 Visual Studio 解决方案。

    如果您在 Visual Studio 2017 中打开教程解决方案,遇到提示您重新定位工程到最新的 Microsoft 工具集时,请点击取消 (Cancel)。

    建议

    要从 Kanzi Studio 打开 Kanzi Studio 工程的目录,选择文件 (File) > 在 Windows 资源管理器中打开 (Open in Windows Explorer)

  3. 本教程中使用 Kanzi Studio 工程中定义的自定义属性类型。要访问这些自定义属性类型,创建 DynamicPropertyType 并使用 Kanzi Studio 工程中使用的相同名称。
    class LocalizationApplication : public ExampleApplication
    {
        //在 Kanzi Studio 工程中定义的自定义属性类型的共享指针类型。
        typedef shared_ptr<DynamicPropertyType<string> > StringDynamicPropertyTypeSharedPtr;
  4. onProjectLoaded 函数的 LocalizationApplication 类中实现事件处理程序,为存储在Locale_packs目录中的地区包 kzb 文件加载资源,并将地区添加到工程中。
            //设置存储地区包的目录的名称。
            static const string localizationFolderName = "Locale_packs";
    
            //获取 kzb 文件中的屏幕 (Screen) 节点。您可以使用屏幕 (Screen) 节点访问 kzb 文件中的所有其他节点和资源。
            ScreenSharedPtr screen = getScreen();
            //域是所有子系统的集合,包含 Kanzi 资源管理器。您需要让资源管理器访问 kzb 文件中的资源。
            ResourceManager* resourceManager = getDomain()->getResourceManager();
    
            //获取含地区选择按钮的LocaleSelector 节点。
            // 使用 # 符号后跟别名名称访问别名目标节点。
            Node2DSharedPtr localeSelector = screen->lookupNode<Node2D>("#LocaleSelector");
    
            //获取用于设置地区的按钮的 LocaleButton 预制模板。
            //使用 kzb URL 获取对模板的参考。
            // 您使用完整的 kzb 资源路径时,路径以 kzb:// 开头,后跟工程名称和资源位置。
            PrefabTemplateSharedPtr localeButtonPrefab = resourceManager->acquireResource<PrefabTemplate>("kzb://localization/Prefabs/LocaleButton");
    
            //获取自定义属性类型以设置
            // LocaleButton 节点中的地区的名称。您在 Kanzi Studio 工程中创建了自定义属性类型。
            StringDynamicPropertyTypeSharedPtr localeNameProperty = StringDynamicPropertyTypeSharedPtr(new DynamicPropertyType<string>("Localization.LocaleName"));
    
            //获取自定义属性类型以设置应用程序中的地区。
            //您在 Kanzi Studio 工程中创建了自定义属性类型。
            StringDynamicPropertyTypeSharedPtr localeIdProperty = StringDynamicPropertyTypeSharedPtr(new DynamicPropertyType<string>("Localization.LocaleID"));
    
            //读取包含//有地区包的 kzb 文件列表的 binaries.cfg 文件。
            string configFileName = localizationFolderName + "/binaries.cfg";
            ReadOnlyDiskFile binariesConfigFile(configFileName);
            string binariesConfigContents = readAsText(binariesConfigFile);
            stringstream binariesConfigFileStream(binariesConfigContents);
    
            string localeId;
    
            //加载存储在地区包 kzb 文件中的资源。
            while (getline(binariesConfigFileStream, localeId))
            {
                trim(localeId);
    
                //创建 kzb 文件路径。
                string localizationKzbFilePath = localizationFolderName + "/" + localeId + ".kzb";
    
                //将 kzb 文件添加到 Kanzi 资源管理器。
                getResourceManager()->addKzbFile(localizationKzbFilePath);
    
                string dictionaryUrl = "kzb://localization/Locales/" + localeId;
                ResourceDictionarySharedPtr localeDictionary = getResourceManager()->acquireResource<ResourceDictionary>(dictionaryUrl);
                
                //实例化 LocaleButton 预设件。
                Node2DSharedPtr localeButton = localeButtonPrefab->instantiate<Node2D>("LocaleButton_" + localeId);
    
                //从存储在地区包中的地区表中的资源 ID LocaleDisplayName //获取显示在应用程序中的地区的名称。
                TextResourceSharedPtr localeDisplayNameResource = localeDictionary->acquire<TextResource>(ResourceID("LocaleDisplayName"));
    
                //设置 LocaleName 属性,使按钮中的 Text Block 2D 节点显示地区的名称。
                localeButton->setProperty(*localeNameProperty, localeDisplayNameResource->getText());
                //设置 LocaleID 属性,您点击按钮时应用程序更改为该地区。
                localeButton->setProperty(*localeIdProperty, localeId);
    
                //设置按钮中 Text Block 2D 节点的样式,为
                //地区的 LocaleDisplayName 设置正确的字体。
                //使用这种方法仅应用地区包中的样式而不改变应用程序中的地区
                //。
                optional<string> localeStyle = localeDictionary->find(ResourceID("LocaleStyle"));
                StyleSharedPtr style = getResourceManager()->acquireResource<Style>(*localeStyle);
                localeButton->setStyle(style);
    
                //将 LocaleButton 节点添加到 LocaleSelector 节点。
                localeSelector->addChild(localeButton);
            }
    
  5. 在 Visual Studio 中,为您的 Visual Studio 版本选择一个解决方案配置并运行应用程序。
    例如,如果您仍在开发应用程序,选择GL_vs2015_Debug 配置。要创建 Kanzi 应用程序的产品版本,选择一个可用的发布配置。

在应用程序中 Kanzibinaries.cfg 文件中列出的文件 kzb 文件中加载地区包,并在 LocaleSelector 节点中为每个地区实例化一个LocaleButton 预设件。


< 上一步

接下来该做什么?

在本教程中,您学习了如何本地化 Kanzi 应用程序,并在您的应用程序中使用仅包含本地化资源的其他 kzb 文件。要进一步学习本教程,您可以使用本地化表 .pot 模板将 Kanzi 应用程序的内容翻译到其他语言。另外,您可以创建其他资源类型,并为不同的地区创建不同的资源。例如,创建几个动画并各用于不同的地区:

另请参阅

要详细了解有关如何本地化您的 Kanzi 应用程序的信息,请参阅本地化

要详细了解有关 kzb 文件的信息,请参阅使用 kzb 文件

要了解有关 Kanzi 如何处理资源的信息,请参阅资源管理

要详细了解有关如何使用资源字典的信息,请参阅资源

要详细了解有关如何使用应用程序中字体的信息,请参阅导入字体

要详细了解有关如何使用应用程序中状态机的信息,请参阅使用状态机

要详细了解有关管理Kanzi Studio工程的信息,请参阅工程

要了解创建Kanzi 应用程序的更多信息,请参阅教程

要了解有关 Kanzi Studio 功能的更多信息,请参阅使用 ...